import java.util.*;
import java.util.concurrent.Callable;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 徐海涛
 * Date: 2022-02-20
 * Time: 13:34
 */
public class TestDemo2 {

//关于set和map使用
    //1.当题中说到搜索的时候我们 采用set和map
    //2.当 求 次数的时候 我们使用 map
    //3.当 求 去重 重复 的时候 我们使用 set

    //key是关键字 value 出现的次数
    public static Map<Integer,Integer> func1(int[] array) {
        HashMap<Integer,Integer> map = new HashMap<>();
        //出现次数做题的关键在于 判断array中的元素是否在map当中，如果不在就是1
        //在就是在原来的基础上＋1
        for (int x :array) {
            if(map.get(x) == null) {//如果关键字x一次都没有出现
                map.put(x,1);//不在就是1
            }else {
                //关键字X在array中
                int val = map.get(x);//找到原来的x所对应的次数
                map.put(x,val+1);
            }
        }
        return map;
    }

    //1.给定1w个数据，统计每个数据出现的次数
    public static void main(String[] args) {
        int[] array = new int[1_0000];
        Random random = new Random();
        for (int i = 0; i < array.length; i++) {
            array[i] = random.nextInt(1000);
        }
        Map<Integer,Integer> ret = func1(array);
        System.out.println(ret);
    }



    //2.将10W个数据中的数据去重
    //方法直接把数据放在set当中
    public static Set<Integer> func2(int[] array) {
        HashSet<Integer> set = new HashSet<>();
        for (int x : array) {
            set.add(x);
        }
        return set;
    }

    public static void main2(String[] args) {
        int[] array = new int[1_0000];
        Random random = new Random();
        for (int i = 0; i < array.length; i++) {
            array[i] = random.nextInt(1000);
        }
        Set<Integer> set = func2(array);
        System.out.println(set);
    }


    //3.从10w个数据中，找出第一个重复的元素
    //方法，每次把元素放到set里，放之前检查一下，set中是不是已经有了
    public static int func3(int[] array) {
        HashSet<Integer> set = new HashSet<>();
        for (int x : array) {
            if(set.contains(x)) {
                return x;
            }else {
                set.add(x);
            }
        }
        return -1;
    }





//面试题
    //第一题
    //只出现一次的函数
    public int singleNumber1(int[] nums) {
        HashSet<Integer> set = new HashSet<>();
        for (int x : nums) {
            if(set.contains(x)) {
                set.remove(x);
            }else {
                set.add(x);
            }
        }
        for (int i = 0; i < nums.length; i++) {
            if(set.contains(nums[i])) {
                return nums[i];
            }
        }
        return -1;
    }


    public static void main3(String[] args) {

    }
//
    // 复制带随机指针的链表
    public Node1 copyRandomList(Node1 head) {
        Map<Node1,Node1> map = new HashMap<>();
        Node1 cur = head;
        while (cur != null) {
            Node1 node1 = new Node1(cur.val);
            map.put(cur,node1);
            cur = cur.next;
        }
        cur = head;
        while (cur != null) {
            map.get(cur).next = map.get(cur.next);
            map.get(cur).random = map.get(cur.random);
            cur = cur.next;
        }
        return map.get(head);
    }

//宝石和石头


//旧键盘 (20)旧键盘上坏了几个键，于是在敲一段文字的时候，对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字，请你列出
//肯定坏掉的那些键。
    //输入 7_This_is_a_test 预期输出
    // _hs_s_a_es  实际输出
    //输出7TI
    public static void func(String strExce,String strActual) {
        HashSet<Character> set = new HashSet<>();
        for (Character ch :strExce.toUpperCase().toCharArray()) {
            set.add(ch);
        }
        HashSet<Character> broken = new HashSet<>();
        for (Character ch :strActual.toUpperCase().toCharArray()) {
            if(!set.contains(ch) && !broken.contains(ch)) {
                System.out.println(ch);
                broken.add(ch);
            }
        }
    }

    public static void main8(String[] args) {
        func("7_This_is_a_test","_hs_s_a_es");

    }
}
class Node1 {
    int val;
    Node1 next;
    Node1 random;

    public Node1(int val) {
        this.val = val;
        this.next = null;
        this.random = null;
    }
}










